#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>

#define SERVICE_FILE "/etc/systemd/system/wgjt.service"
#define SERVICE_CONTENT \
"[Unit]\n"\
"Description = wggs server\n"\
"After = network.target syslog.target\n"\
"Wants = network.target\n"\
"\n"\
"[Service]\n"\
"Type = simple\n"\
"ExecStart = /root/wggs -c /root/server.conf\n"\
"Restart = on-abnormal\n"\
"RestartSec = 5s\n"\
"KillMode = mixed\n"\
"\n"\
"[Install]\n"\
"WantedBy = multi-user.target\n"

// 检查命令是否存在
int command_exists(const char *cmd) {
    char command[256];
    snprintf(command, sizeof(command), "command -v %s >/dev/null 2>&1", cmd);
    return system(command) == 0;
}

// 检查文件是否存在
int file_exists(const char *path) {
    struct stat st;
    return stat(path, &st) == 0;
}

// 执行系统命令并返回结果
int execute_command(const char *cmd) {
    printf("执行命令: %s\n", cmd);
    int status = system(cmd);
    if (WIFEXITED(status)) {
        return WEXITSTATUS(status);
    }
    return -1;
}

// 检查并安装systemd
int check_and_install_systemd() {
    printf("检查systemd是否已安装...\n");
    
    // 检查systemd是否已经安装（通过检查systemctl命令是否存在）
    if (command_exists("systemctl")) {
        printf("systemd 已经安装\n");
        return 0;
    }
    
    printf("systemd 未安装，开始安装...\n");
    
    // 检查yum是否可用
    if (!command_exists("yum")) {
        printf("错误: yum 命令不存在，无法安装systemd\n");
        return -1;
    }
    
    // 安装systemd
    if (execute_command("yum install -y systemd") != 0) {
        printf("安装systemd失败\n");
        return -1;
    }
    
    printf("systemd 安装成功\n");
    return 0;
}

// 创建service文件
int create_service_file() {
    printf("创建service文件: %s\n", SERVICE_FILE);
    
    // 检查是否已经有service文件
    if (file_exists(SERVICE_FILE)) {
        printf("service文件已存在，跳过创建\n");
        return 0;
    }
    
    // 检查是否有写入权限
    if (geteuid() != 0) {
        printf("需要root权限来创建service文件\n");
        return -1;
    }
    
    // 创建service文件
    FILE *file = fopen(SERVICE_FILE, "w");
    if (file == NULL) {
        perror("无法创建service文件");
        return -1;
    }
    
    // 写入内容
    if (fputs(SERVICE_CONTENT, file) == EOF) {
        perror("写入service文件失败");
        fclose(file);
        return -1;
    }
    
    fclose(file);
    printf("service文件创建成功\n");
    
    // 设置正确的文件权限
    if (chmod(SERVICE_FILE, 0644) != 0) {
        perror("设置文件权限失败");
        return -1;
    }
    
    return 0;
}

// 启动并启用服务
int start_and_enable_service() {
    printf("启动wgjt服务...\n");
    
    // 重新加载systemd配置
    if (execute_command("systemctl daemon-reload") != 0) {
        printf("重新加载systemd配置失败\n");
        return -1;
    }
    
    // 启动服务
    if (execute_command("systemctl start wgjt") != 0) {
        printf("启动服务失败\n");
        return -1;
    }
    
    // 启用开机自启
    if (execute_command("systemctl enable wgjt") != 0) {
        printf("启用开机自启失败\n");
        return -1;
    }
    
    // 检查服务状态
    printf("检查服务状态:\n");
    if (execute_command("systemctl status wgjt") != 0) {
        printf("服务状态检查失败\n");
        return -1;
    }
    
    return 0;
}

int main() {
    printf("=== 开始配置wgjt服务 ===\n");
    
    // 检查是否是root用户
    if (geteuid() != 0) {
        printf("错误: 需要root权限运行此程序\n");
        printf("请使用 sudo 运行: sudo ./program_name\n");
        return 1;
    }
    
    // 1. 检查并安装systemd
    if (check_and_install_systemd() != 0) {
        printf("systemd安装检查失败\n");
        return 1;
    }
    
    // 2. 创建service文件
    if (create_service_file() != 0) {
        printf("创建service文件失败\n");
        return 1;
    }
    
    // 3. 启动并启用服务
    if (start_and_enable_service() != 0) {
        printf("启动服务失败\n");
        return 1;
    }
    
    printf("\n=== 配置完成 ===\n");
    printf("服务已成功安装并启动\n");
    printf("可以使用以下命令管理服务:\n");
    printf("  sudo systemctl start wgjt     # 启动服务\n");
    printf("  sudo systemctl stop wgjt      # 停止服务\n");
    printf("  sudo systemctl restart wgjt   # 重启服务\n");
    printf("  sudo systemctl status wgjt    # 查看状态\n");
    printf("  sudo systemctl enable wgjt    # 开机自启\n");
    printf("  sudo systemctl disable wgjt   # 禁用开机自启\n");
    
    return 0;
}